<?php
/**
 * Created by PhpStorm.
 * User: Inhere
 * Date: 14-4-3
 * Time: 下午3:54
 */

namespace ulue\core\db\mysql\driver;
use Ulue,
    Debug;
use ulue\core\db\DatabaseException;
use ulue\core\db\AbstractDbUnit;

class OldMysqlDriver extends AbstractDbUnit
{

    //定义私有化静态变量 保存实例化的对象，默认为空--表示尚未存储
    static private $dbInstance  = NULL;
    protected $STMT             = NULL; //预处理对象
    private $isbeginTrans       = false; //是否开启事务

    /**
     * 构造函数私有化，不允许实例化
     * @param $tableName
     * @param $tblPrefix
     * @param $connectStr
     */
    public function __construct($tableName,$connectStr)
    {
        parent::__construct($tableName,$connectStr);
    }

    /**
     * ************** 数据库连接、选择 ******************
     */
    private function connect()
    {
        if (is_null(self::$dbInstance))
        {
            # 连接数据库
            try{
                $connect = mysql_connect($this->dbHost.':'.$this->dbPort,$this->dbUser,$this->dbPwd);
            }
            catch(DatabaseException $e)
            {
                // $this->sendError("数据库[ 链接 ]失败!!". mysqli_connect_errno().mysqli_connect_error());
                throw new DatabaseException( 'database connect failed!'.$e->getMessage(),'db' );
            }

            # 选择数据库
            $select = mysql_select_db($this->_db['name'],$this->_connect);

            if (!$select)
            {
                $this->sendError("数据库[ 选择 ]失败!!".mysql_errno().mysql_error());
            }
            self::$dbInstance = $connect;
        }
        $this->_connect = self::$dbInstance;
        $this->setCharset();# 字符集

        return $this->_connect;
    }

    public function setCharset()
    {
        # 设置数据传输的编码
        $this->exec("SET NAMES {$this->_db['charset']}");
    }

    public function exec($sql='')
    {
        return mysql_query($sql);
    }
    /**
     * 执行查询，有返回值,数组
     */
    public function query($sql)
    {
        //调用 $this->execQuery($sql) 执行语句发送，得到结果集$this->queryResultSet
        if ( !$this->execQuery($sql) || !$this->queryResultSet )
        {//todo 如果出错应该不可能执行到这里！？
            $this->sendError('query(): 语句执行出错！<br><em>Error Report: </em>M '.__METHOD__.'() ,
            L '.__LINE__);
        }

        $list = array();

        // 调用 $this->fetch() 遍历结果集
        while (($result = $this->fetch()) != false)
        {
            $list[] = $result;
        }

        return $list;
    }
    /**
     * 执行查询,没有返回值
     */
    public function execQuery($sql)
    {
        if (!empty($sql))
        {
            $this->debug($sql); //将SQL添加到调试DEBUG
            $this->queryResultSet = mysql_query($sql);

            //m_dump($this->queryString,$this->queryResultSet);
            if ( !$this->queryResultSet )
            {
                $this->sendError('execQuery(): 语句执行出错！');
            }

            $this->getAffectedRows();//受影响的行数

            return true;
        } else {
            $this->sendError('execQuery(): 没有语句可执行！');
        }
    }
    /**
     * 遍历结果集  //todo 根据INSERT_ID ??
     * 根据查询结果集 取回成数组
     * 1. $this->query($sql) 调用 2. $this->execQuery($sql) 得到结果集： $this->queryResultSet
     *  3. 调用 $this->fetch() 遍历结果集
     * */
    protected function fetch()
    {
        $res = mysql_fetch_assoc($this->queryResultSet);//
        if (!$res)
        {
            $this->resultFree();
        }

        return $res;
    }
    /**
     * 释放查询结果集
     */
    protected function resultFree()
    {
        if (isset($this->queryResultSet))
        {
            mysql_free_result($this->queryResultSet);
        }
    }

    /**
     * 查询 -- 单行数据
     * @param $param - 条件字符串
     * @return array
     */
    public function getRow($param='')
    {
        $dataArr = $this->getList($param);

        return $dataArr[0];
    }
    /**
     * 查询 -- 多行数据
     * @param $param
     * @return array $dataArr
     */
    public function getList($param='')
    {
        if ( empty($param) && empty($this->options['where']))
        {
            $this->where();
        } else if (!empty($param))
        {
            $this->where($param);
        }

        $this->queryString=$this->buildSqlStatement();
        //dump($this->queryString);
        $dataArr = $this->query($this->queryString);//执行有返回值的查询
        //if (count($dataArr) == 0 )
        //{
            //notice('执行遍历结果集返回数组为空！<br>'.'[SQL语句] '.$this->queryString.
            //'<br><em>Error Report: </em>M '.__METHOD__.'() ,L '.__LINE__);
            //return null;
        //}

        return $dataArr;
    }

    /**
     * 添加 -- 添加数据
     * @param $dataArr - 用传入的数组 $arr中所有 键 和 值 ，代表插入语句对应的 键和值
     * @return int 返回插入记录最后一条的id
     */
    public function insert($dataArr)
    {
        $this->queryString =$this->buildSqlStatement($dataArr,'i');
        $this->execQuery($this->queryString);

        return $this->insertLastId = mysql_insert_id($this->_connect);//插入记录最后一条的id
    }

    public function replace()
    {}
    /**
     * 删除 -- 删除数据
     * @param $where - where语句的条件字符串
     * @return int
     */
    public function delete($where=null)
    {
        if (!is_null($where))
        {
            $this->where($where);
        }

        $this->queryString = $this->buildSqlStatement('','d');
        //dump($this->queryString,1);
        $this->execQuery($this->queryString);

        return $this->getAffectedRows();//返回受影响的行数
    }
    /**
     * 修改 -- 更新数据
     * @param $dataArr - 用传入的数组 $arr中所有值 ，代表插入语句对应的值
     * @return int 返回受影响的行数,执行语句失败的话，函数返回 -1。
     */
    public function update($dataArr)
    {
        $this->queryString=$this->buildSqlStatement($dataArr,'u');
        $this->execQuery($this->queryString);
        return $this->getAffectedRows();//返回受影响的行数
    }

    /**
     * 缓存查询结果数据
     */
    private function cacheQueryData()
    {

    }

    /**
     * 获取最近的错误信息
     * @access public
     * @return string
     */
    public function getError()
    { return $this->lastError; }
    /**
     * 防止外部克隆
     */
    private function __clone()
    {}
    /**
     * 关闭连接
     */
    public function close()
    {
        if (is_resource($this->_connect) )
        {
            mysql_close($this->_connect);
            self::$dbInstance= null;
            $this->_connect = null;
        }
    }


} //===GDb class end===